home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Boxer / PalmBoxer / boxer.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  11.5 KB  |  483 lines

  1. /* released under the GNU public license, see www.gnu.org */
  2.  
  3. #pragma pack(2)
  4.  
  5. #include <Common.h>
  6. #include <System/SysAll.h>
  7. #include <UI/UIAll.h>
  8. #include <ExgMgr.h>
  9. #include <System/FileStream.h>
  10. #include "boxer.h"
  11.  
  12. #include <Unix/sys_types.h>
  13.  
  14. #include "stringil.h"
  15. #include "stdio2.h"
  16.  
  17. /* this is the callback stuff from Callback.h by ian in O'Reilly's book */
  18. register void *reg_a4 asm("%a4");
  19.  
  20. #define CALLBACK_PROLOGUE \
  21. void *save_a4 = reg_a4; asm("move.l %%a5,%%a4; sub.l #edata,%%a4" : :)
  22.  
  23. #define CALLBACK_EPILOGUE reg_a4 = save_a4
  24.  
  25. static int toprow = 0;
  26. static int maxrow = 0;
  27. static int selection = -1;
  28.  
  29. static int mode;
  30.  
  31. static char *filelist;
  32. static char filecard[64];
  33. static long int filedisp[64];
  34. FileHand archfd;
  35.  
  36.  
  37. /* **************************************************************************** */
  38.  
  39. static void TableDrawCell(VoidPtr tableP, Word row, Word column,
  40.                           RectanglePtr bounds)
  41. {
  42.   char *c;
  43.   c = (char *) TblGetRowData(tableP, row);
  44.   WinDrawChars(c, strlen(c), bounds->topLeft.x, bounds->topLeft.y);
  45. }
  46.  
  47. /* **************************************************************************** */
  48.  
  49. int unzipdir(FileHand infile, char *dir, long int *loc);
  50. int untardir(FileHand fd, char *dir, long int *loc);
  51.  
  52. static void scandbs()
  53. {
  54.   LocalID lid;
  55.   UInt16 cardno, attr;
  56.   UInt32 type, crea;
  57.   int i;
  58.   char tp[40], *c;
  59.  
  60.   maxrow = 0;
  61.   if (filelist == NULL)
  62.     filelist = MemPtrNew(1024);
  63.  
  64.   c = filelist;
  65.   *c = 0;
  66.   c[1] = 0;
  67.   maxrow = 0;
  68.   for (cardno = 0; cardno < MemNumCards(); cardno++) {
  69.     for (i = 0; i < DmNumDatabases(cardno); i++) {
  70.       lid = DmGetDatabase(cardno, i);
  71.       DmDatabaseInfo(cardno, lid, tp, &attr, NULL, NULL, NULL, NULL, NULL, NULL,
  72.                      NULL, &type, &crea);
  73.       if (!(attr & dmHdrAttrStream) || type != 'DATA')
  74.         continue;
  75.       if (crea != 'NZIP' && crea != 'BRWS' && crea != 'ATCH' && crea != 'BOXR')
  76.         continue;
  77.  
  78.       strcpy(c, tp);
  79.       filecard[maxrow] = cardno;
  80.       filedisp[maxrow++] = i;
  81.  
  82.       c += strlen(c) + 1;
  83.       *c = 0;
  84.  
  85.     }
  86.   }
  87. }
  88.  
  89.  
  90.  
  91. int unzip(FileHand infile, long int loc);
  92. int untar(FileHand fd, long int loc);
  93. int MakeDoc(char *name, FileHand fd, int destruct);
  94. int MakeDatabase(FileHand fd, int destruct);
  95.  
  96. static Boolean TableEventHandler(EventPtr event)
  97. {
  98.   TablePtr tptr;
  99.   Word n;
  100.   FormPtr frm;
  101.   int handled = false;
  102.   UInt top;
  103.   Word row, numRows;
  104.   char *c;
  105.   LocalID lid;
  106.   FileHand fd;
  107.   char name[256];
  108.   UInt32 len, type, crea;
  109.  
  110.   switch (event->eType) {
  111.   case frmOpenEvent:
  112.  
  113.     WinEraseWindow();
  114.     frm = FrmGetActiveForm();
  115.     tptr = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, maintable));
  116.     top = toprow;
  117.     numRows = TblGetNumberOfRows(tptr);
  118.  
  119.     c = filelist;
  120.     n = top;
  121.     while (n-- && *c)
  122.       c += strlen(c) + 1;
  123.  
  124.     for (row = 0; row < numRows; row++, top++) {
  125.  
  126.       if (*c) {
  127.         TblSetRowData(tptr, row, (ULong) c);
  128.         c += strlen(c) + 1;
  129.       }
  130.  
  131.       if (top < maxrow) {
  132.         for (n = 0; n < 1; n++) {
  133.           TblSetItemStyle(tptr, row, n, customTableItem);
  134.           TblSetCustomDrawProcedure(tptr, n, TableDrawCell);
  135.         }
  136.         TblMarkRowInvalid(tptr, row);
  137.       } else
  138.         TblSetRowUsable(tptr, row, false);
  139.     }
  140.     for (n = 0; n < 1; n++)
  141.       TblSetColumnUsable(tptr, n, true);
  142.  
  143.     FrmDrawForm(frm);
  144.  
  145.     selection = -1;
  146.     break;
  147.  
  148.   case keyDownEvent:
  149.     if (event->data.keyDown.chr != pageUpChr &&
  150.         event->data.keyDown.chr != pageDownChr) break;
  151.  
  152.     frm = FrmGetActiveForm();
  153.     tptr = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, maintable));
  154.     n = TblGetNumberOfRows(tptr);
  155.     toprow += n * (((event->data.keyDown.chr == pageDownChr) << 1) - 1);
  156.     if ((toprow + n) >= maxrow)
  157.       toprow = maxrow - n;
  158.     if (toprow < 0)
  159.       toprow = 0;
  160.  
  161.     FrmGotoForm(FrmGetActiveFormID());
  162.  
  163.     handled = true;
  164.     break;
  165.  
  166.   case ctlSelectEvent:
  167.     {
  168.       int eid;
  169.  
  170.       handled = true;
  171.  
  172.       eid = event->data.ctlEnter.controlID;
  173.  
  174.       if (eid == bexit) {
  175.         mode = 0;
  176.         FileClose(archfd);
  177.         scandbs();
  178.         FrmGotoForm(mainform);
  179.         break;
  180.       }
  181.  
  182.       if (selection == -1)
  183.         break;
  184.  
  185.       switch (eid) {
  186.  
  187.       case bunzip:
  188.  
  189.         if (mode) {
  190.           WinEraseWindow();
  191.           unzip(archfd, filedisp[selection]);
  192.           FrmGotoForm(unzipform);
  193.           break;
  194.         }
  195.  
  196.         lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  197.         DmDatabaseInfo(filecard[selection], lid, name, NULL, NULL, NULL, NULL,
  198.                        NULL, NULL, NULL, NULL, &type, &crea);
  199.         archfd = FileOpen(filecard[selection], name, type, crea,
  200.                           fileModeUpdate | fileModeAnyTypeCreator, NULL);
  201.         n = unzipdir(archfd, filelist, filedisp);
  202.  
  203.         if (n) {
  204.           mode = 1;
  205.           maxrow = n;
  206.           FrmGotoForm(unzipform);
  207.         } else {
  208.           FrmAlert(4000);
  209.           FileClose(archfd);
  210.           scandbs();
  211.           FrmGotoForm(mainform);
  212.         }
  213.  
  214.  
  215.         break;
  216.  
  217.       case buntar:
  218.  
  219.         if (mode) {
  220.           WinEraseWindow();
  221.           untar(archfd, filedisp[selection]);
  222.           FrmGotoForm(untarform);
  223.           break;
  224.         }
  225.  
  226.         lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  227.         DmDatabaseInfo(filecard[selection], lid, name, NULL, NULL, NULL, NULL,
  228.                        NULL, NULL, NULL, NULL, &type, &crea);
  229.         archfd = FileOpen(filecard[selection], name, type, crea,
  230.                           fileModeUpdate | fileModeAnyTypeCreator, NULL);
  231.         n = untardir(archfd, filelist, filedisp);
  232.         if (n) {
  233.           mode = 2;
  234.           maxrow = n;
  235.           FrmGotoForm(untarform);
  236.         } else {
  237.           FrmAlert(4000);
  238.           FileClose(archfd);
  239.           scandbs();
  240.           FrmGotoForm(mainform);
  241.         }
  242.  
  243.         break;
  244.  
  245.  
  246.       case bripunzip:
  247.  
  248.         lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  249.  
  250.         DmDatabaseInfo(filecard[selection], lid, name, NULL, NULL, NULL, NULL,
  251.                        NULL, NULL, NULL, NULL, &type, &crea);
  252.  
  253.         fd = FileOpen(filecard[selection], name, type, crea,
  254.                       fileModeUpdate | fileModeAnyTypeCreator, NULL);
  255.  
  256.         n = unzip(fd, -1);
  257.         if (n == -1) {
  258.           FileSeek(fd, 0, fileOriginBeginning);
  259.           n = untar(fd, -1);
  260.         }
  261.         FileClose(fd);
  262.         if (n != -1)
  263.           FileDelete(filecard[selection], name);
  264.  
  265.         scandbs();
  266.         break;
  267.  
  268.       case btodoc:
  269.  
  270.         lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  271.         DmDatabaseInfo(filecard[selection], lid, name, NULL, NULL, NULL, NULL,
  272.                        NULL, NULL, NULL, NULL, &type, &crea);
  273.         fd = FileOpen(filecard[selection], name, type, crea,
  274.                       fileModeUpdate | fileModeAnyTypeCreator, NULL);
  275.  
  276.         strcat(name, ".box");
  277.  
  278.         {
  279.           int destr;
  280.           destr = FrmAlert(3000);
  281.           MakeDoc(name, fd, destr);
  282.           FileClose(fd);
  283.           if (destr) {
  284.             name[strlen(name) - 4] = 0;
  285.             FileDelete(filecard[selection], name);
  286.  
  287.           }
  288.  
  289.         }
  290.  
  291.         scandbs();
  292.         FrmGotoForm(mainform);
  293.  
  294.         break;
  295.  
  296.       case binstall:
  297.  
  298.         lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  299.         DmDatabaseInfo(filecard[selection], lid, name, NULL, NULL, NULL, NULL,
  300.                        NULL, NULL, NULL, NULL, &type, &crea);
  301.         fd = FileOpen(filecard[selection], name, type, crea,
  302.                       fileModeUpdate | fileModeAnyTypeCreator, NULL);
  303.         {
  304.           int destr;
  305.           destr = FrmAlert(3000);
  306.           MakeDatabase(fd, destr);
  307.           FileClose(fd);
  308.           if (destr)
  309.             FileDelete(filecard[selection], name);
  310.         }
  311.  
  312.         scandbs();
  313.         FrmGotoForm(mainform);
  314.  
  315.         break;
  316.  
  317.       case bdelete:
  318.  
  319.         if (FrmAlert(2000))
  320.           break;
  321.  
  322.         lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  323.         DmDeleteDatabase(filecard[selection], lid);
  324.         scandbs();
  325.         FrmGotoForm(mainform);
  326.         break;
  327.  
  328.       case bbeam:
  329.  
  330.         {
  331.           Word err;
  332.           UInt32 xcnt, outhis, tlen;
  333.           ExgSocketType exgSocket;
  334.           char name[256],tname[64];
  335.  
  336.           lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  337.  
  338.           DmDatabaseInfo(filecard[selection], lid, name, NULL, NULL, NULL, NULL,
  339.                          NULL, NULL, NULL, NULL, &type, &crea);
  340.  
  341.  
  342.           fd = FileOpen(filecard[selection], name, type, crea,
  343.                         fileModeReadOnly | fileModeAnyTypeCreator, NULL);
  344.           FileTell(fd, &len, NULL);
  345.  
  346.           MemSet(&exgSocket, sizeof(exgSocket), 0);
  347.       strcpy(tname,name);
  348.           exgSocket.description = tname;
  349.           exgSocket.name = tname;
  350.           exgSocket.length = len;
  351.           exgSocket.target = 'BOXR';
  352.  
  353.           err = ExgPut(&exgSocket);
  354.           if (err)
  355.         break;
  356.       xcnt = 0;
  357.       tlen = 0;
  358.       while (!err && xcnt < len) {
  359.         if( xcnt + tlen < len ) {
  360.           outhis = FileRead(fd, &name[tlen], 1, 256 - tlen, NULL);
  361.           tlen += outhis;
  362.         }
  363.         outhis = ExgSend(&exgSocket, name, tlen, &err);
  364.         if (err)
  365.           break;
  366.             xcnt += outhis;
  367.         tlen -= outhis;
  368.           }
  369.       ExgDisconnect(&exgSocket, err);
  370.       FileClose(fd);
  371.     }
  372.  
  373.         break;
  374.       }
  375.     }
  376.     break;
  377.  
  378.   case tblSelectEvent:
  379.     selection = toprow + event->data.tblSelect.row;
  380. #if 0
  381.     {
  382.       char buf[20];
  383.       UInt32 type, crea;
  384.  
  385.       StrIToA(buf, selection);
  386.       strcat(buf, "     ");
  387.       WinDrawChars(buf, strlen(buf), 0, 145);
  388.       lid = DmGetDatabase(filecard[selection], filedisp[selection]);
  389.       DmDatabaseInfo(filecard[selection], lid, NULL, NULL, NULL, NULL, NULL,
  390.                      NULL, NULL, NULL, NULL, &type, &crea);
  391.       WinDrawChars(&type, 4, 40, 145);
  392.       WinDrawChars(&crea, 4, 80, 145);
  393.     }
  394. #endif
  395.     handled = true;
  396.     break;
  397.   default:
  398.     return 0;
  399.   }
  400.   return handled;
  401. }
  402.  
  403. /* **************************************************************************** */
  404.  
  405. int dirtyp;
  406.  
  407. DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
  408. {
  409.   short err;
  410.   int formID;
  411.   FormPtr form;
  412.   EventType event;
  413.  
  414.   if (cmd == sysAppLaunchCmdExgReceiveData) {
  415.     ExgSocketPtr exgSocketP = (ExgSocketPtr) cmdPBP;
  416.     unsigned char buf[256];
  417.     int inthis;
  418.     FileHand fd;
  419.  
  420.     err = ExgAccept(exgSocketP);
  421.  
  422.     fd = FileOpen(0, exgSocketP->name, 'DATA', 'BOXR',
  423.                   fileModeReadWrite | fileModeAnyTypeCreator, NULL);
  424.  
  425.     if ((launchFlags & sysAppLaunchFlagSubCall)) {
  426.       CALLBACK_PROLOGUE;
  427.       dirtyp++;
  428.       CALLBACK_EPILOGUE;
  429.     }
  430.  
  431.     if (err)
  432.       return err;
  433.  
  434.     inthis = 1;
  435.     while (inthis) {
  436.       inthis = ExgReceive(exgSocketP, buf, 256, &err);
  437.       if (err)
  438.         break;
  439.       FileWrite(fd, buf, 1, inthis, NULL);
  440.     }
  441.     ExgDisconnect(exgSocketP, err);
  442.     FileClose(fd);
  443.     return 0;
  444.  
  445.   } else if (cmd == sysAppLaunchCmdExgAskUser) {
  446.     ExgAskParamPtr exgP = (ExgAskParamPtr) cmdPBP;
  447.     exgP->result = exgAskDialog; /* Dialog, Ok, Cancel */
  448.     return 0;
  449.   } else if( cmd != sysAppLaunchCmdNormalLaunch )
  450.     return 0;
  451.  
  452.   toprow = 0;
  453.   dirtyp = 1;
  454.   filelist = NULL;
  455.   do {
  456.     if (dirtyp) {
  457.       scandbs();
  458.       FrmGotoForm(mainform);
  459.       dirtyp = 0;
  460.     }
  461.  
  462.     EvtGetEvent(&event, 0);
  463.     if (SysHandleEvent(&event))
  464.       continue;
  465.     if (MenuHandleEvent((void *) 0, &event, &err))
  466.       continue;
  467.     if (event.eType == frmLoadEvent) {
  468.       formID = event.data.frmLoad.formID;
  469.       form = FrmInitForm(formID);
  470.       FrmSetActiveForm(form);
  471.       switch (formID) {
  472.       case mainform:
  473.       case unzipform:
  474.       case untarform:
  475.         FrmSetEventHandler(form, TableEventHandler);
  476.         break;
  477.       }
  478.     }
  479.     FrmDispatchEvent(&event);
  480.   } while (event.eType != appStopEvent);
  481.   return 0;
  482. }
  483.